﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuanLyNganHangDe.DAL.Models;

namespace QuanLyNganHangDe.GUI.TacNghiep
{
    public partial class FormQuanLyDeThi : Form
    {
        #region Thuộc tính
        NamHoc SelectedNamHoc
        {
            get
            {
                NamHoc namHoc = null;
                if (bsNamHoc.Current != null)
                    namHoc = bsNamHoc.Current as NamHoc;
                return namHoc;
            }
        }

        HocKy SelectedHocKy
        {
            get
            {
                HocKy hocKy = null;
                if (bsHocKy.Current != null)
                    hocKy = bsHocKy.Current as HocKy;
                return hocKy;
            }
        }

        DotThi SelectedDotThi
        {
            get
            {
                DotThi dotThi = null;
                if (bsDotThi.Current != null)
                    dotThi = bsDotThi.Current as DotThi;
                return dotThi;
            }
        }

        DeInRa SelectedDeInRa
        {
            get
            {
                DeInRa de = null;
                if (bsDeThi.Current != null)
                    de = bsDeThi.Current as DeInRa;
                return de;
            }
        }
        #endregion

        public FormQuanLyDeThi()
        {
            InitializeComponent();
        }

        private void FormQuanLyDeThi_Load(object sender, EventArgs e)
        {
            NapDanhSachNamHoc();
        }

        private void NapDanhSachNamHoc()
        {
            m_DontUpdateByNamHoc = true;
            var lstNamHoc = BLL.BizNamHoc.GetListNamHoc();
            bsNamHoc.DataSource = lstNamHoc;
            cbxNamHoc.DataSource = bsNamHoc;
            cbxNamHoc.DisplayMember = "NamHoc1";
            m_DontUpdateByNamHoc = false;
            UpdateGuiBySelectedNamHoc();
        }

        private bool m_DontUpdateByNamHoc = false;
        private void bsNamHoc_CurrentChanged(object sender, EventArgs e)
        {
            if (m_DontUpdateByNamHoc)
                return;
            UpdateGuiBySelectedNamHoc();
        }

        private void UpdateGuiBySelectedNamHoc()
        {
            NapDanhSachHocKy();
        }

        private void NapDanhSachHocKy()
        {
            m_DontUpdateByHocKy = true;
            var namHoc = this.SelectedNamHoc;
            if (namHoc == null)
            {
                bsHocKy.DataSource = null;
                cbxHocKy.Enabled = false;
            }
            else
            {
                var lstHocKy = BLL.BizHocKy.GetList_HocKy(namHoc.NamHoc1);
                bsHocKy.DataSource = lstHocKy;
                cbxHocKy.Enabled = true;
            }
            cbxHocKy.DataSource = bsHocKy;
            cbxHocKy.DisplayMember = "TenHocKy";
            m_DontUpdateByHocKy = false;
            UpdateGuiBySelectedHocKy();
        }

        private bool m_DontUpdateByHocKy = false;
        private void bsHocKy_CurrentChanged(object sender, EventArgs e)
        {
            if (m_DontUpdateByHocKy)
                return;
            UpdateGuiBySelectedHocKy();
        }

        private void HienThiThongKeDotThi()
        {
            if (bsDotThi.Count == 0)
                lblDotThi_ThongKe.Text = "Chưa có đợt thi nào";
            else
                lblDotThi_ThongKe.Text = string.Format("Có {0} đợt thi", bsDotThi.Count);
        }
        private void UpdateGuiBySelectedHocKy()
        {
            m_DontUpdateByDotThi = true;
            var hocKy = this.SelectedHocKy;
            if (hocKy == null)
            {
                bsDotThi.DataSource = null;
                container.Panel1.Enabled = false;
            }
            else
            {
                var lstDotThi = BLL.BizDotThi.GetListDotThi(hocKy.MaHocKy);
                bsDotThi.DataSource = lstDotThi;
                container.Panel1.Enabled = true;
            }
            HienThiThongKeDotThi();
            gridDotThi.AutoGenerateColumns = false;
            gridDotThi.DataSource = bsDotThi;
            m_DontUpdateByDotThi = false;
            UpdateGuiBySelectedDotThi();
        }

        private bool m_DontUpdateByDotThi = false;
        private void bsDotThi_CurrentChanged(object sender, EventArgs e)
        {
            if (m_DontUpdateByDotThi)
                return;
            UpdateGuiBySelectedDotThi();
        }

        private void HienThiThongKeDeThi()
        {
            if (bsDeThi.Count == 0)
                lblDeThi_ThongKe.Text = "Chưa có đề thi nào";
            else
                lblDeThi_ThongKe.Text = string.Format("Có {0} đề thi đã được tạo", bsDeThi.Count);
        }

        private void UpdateGuiBySelectedDotThi()
        {
            m_DontUpdateByDeThi = true;
            var dotThi = this.SelectedDotThi;
            if (dotThi == null)
            {
                bsDeThi.DataSource = null;
                btnDotThi_Delete.Enabled = btnDotThi_Edit.Enabled = false;
                lblDanhSachDeThiHeader.Text = "";
            }
            else
            {
                bsDeThi.DataSource = new MySortableBindingList<DeInRa>(BLL.BizDeInRa.GetListDeInRaWithTenHocPhan(dotThi.MaDotThi));
                gridDeThi.AutoGenerateColumns = false;
                gridDeThi.DataSource = bsDeThi;
                btnDotThi_Delete.Enabled = btnDotThi_Edit.Enabled = true;
                lblDanhSachDeThiHeader.Text = string.Format("Danh sách đề thi cho đợt thi {0}", dotThi.TenDotThi);
            }
            m_DontUpdateByDeThi = false;
            btnDeleteAll.Enabled = bsDeThi.Count > 0;
            HienThiThongKeDeThi();
            UpdateGuiBySelectedDeThi();
        }

        private bool m_DontUpdateByDeThi = false;
        private void bsDeThi_CurrentChanged(object sender, EventArgs e)
        {
            if (m_DontUpdateByDeThi)
                return;
            UpdateGuiBySelectedDeThi();
        }

        private void UpdateGuiBySelectedDeThi()
        {
            var deThi = this.SelectedDeInRa;
            if (deThi == null)
            {
                btnDeThi_Xoa.Enabled = false;
                btnDeThi_Details.Enabled = false;
                //btnDethi_In.Enabled = false;
                //btnDeThi_ExportToRtfFile.Enabled = false;
            }
            else
            {
                btnDeThi_Xoa.Enabled = true;
                btnDeThi_Details.Enabled = true;
                //btnDethi_In.Enabled = false;
                //btnDeThi_ExportToRtfFile.Enabled = true;
            }
        }

        private void btnDotThi_Add_Click(object sender, EventArgs e)
        {
            var hocKy = this.SelectedHocKy;
            var namHoc = this.SelectedNamHoc;
            var dotThi = new DotThi()
            {
                MaDotThi = System.Guid.NewGuid().ToString(),
                MaHocKy = hocKy.MaHocKy
            };
            var msg = string.Format("Tạo mới đợt thi cho học kỳ {0} năm học {1}", hocKy.TenHocKy, namHoc.NamHoc1);
            var frm = new TacNghiep.FormDotThi_Details(dotThi, isAddingNew: true, headerMsg: msg);
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                bsDotThi.Add(dotThi);
                bsDotThi.Position = bsDotThi.Count - 1;
                HienThiThongKeDotThi();
            }
        }

        private void btnDotThi_Edit_Click(object sender, EventArgs e)
        {
            var dotThi = this.SelectedDotThi;
            if (dotThi == null)
                return;
            var msg = string.Format("Chỉnh sửa đợt thi cho học kỳ {0} năm học {1}", this.SelectedHocKy.TenHocKy, this.SelectedNamHoc.NamHoc1);
            var frm = new TacNghiep.FormDotThi_Details(dotThi, isAddingNew: false, headerMsg: msg);
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                bsDotThi.ResetCurrentItem();
            }
        }

        private void btnDotThi_Delete_Click(object sender, EventArgs e)
        {
            var dotThi = this.SelectedDotThi;
            if (dotThi == null)
                return;
            var ans = MessageBox.Show("Bạn có chắc chắn muốn xoá đợt thi này không?", "Chú ý", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (ans == System.Windows.Forms.DialogResult.Yes)
            {
                try
                {
                    var idx = bsDotThi.Position;
                    BLL.BizDotThi.Delete(dotThi);
                    bsDotThi.RemoveCurrent();
                    bsDotThi.ResetPosition(idx);

                    //if (bsDotThi.Count > 0)
                    //{
                    //    gridDeThi.Rows[bsDotThi.Position].Selected = true;
                    //    gridDotThi.Focus();
                    //}
                    gridDotThi.SelectAt(idx);
                    HienThiThongKeDotThi();
                }
                catch (Exception exc)
                {
                    MessageBox.Show("Không xoá được đợt thi.\nChi tiết lỗi: " + exc.Message);
                }
            }
        }

        private void lnkQuanLyNamHoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            var frm = new GUI.DuLieu.FormHocKy();
            frm.ShowDialog(this);
            NapDanhSachNamHoc();
        }

        private void btnDeThi_Xoa_Click(object sender, EventArgs e)
        {
            var ans = DialogUtils.ShowYesNo("Bạn có chắc chắn muốn xoá đề đang chọn không?");
            if (ans != System.Windows.Forms.DialogResult.Yes)
                return;

            var dethi = this.SelectedDeInRa;
            if (dethi == null)
                return;
            try
            {
                BLL.BizDeInRa.XoaDeInRa(dethi);

                UpdateGuiBySelectedDotThi();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError("Không thể xoá đề thi đang chọn.\nChi tiết lỗi: " + exc);
            }
        }

        private void btnDeThi_Add_Click(object sender, EventArgs e)
        {
            var frm = new TacNghiep.FormDotThi_Import(this.SelectedDotThi, this.SelectedHocKy, this.SelectedNamHoc);
            frm.FormClosed += (oSender, oE) => { UpdateGuiBySelectedDotThi(); };
            Utils.hideAndShowForm(this, frm);
        }

        private void btnDeThi_Details_Click(object sender, EventArgs e)
        {
            var deThi = this.SelectedDeInRa;
            if (deThi != null)
            {
                var frm = new FormDeThi_ChiTiet(deThi, this.SelectedHocKy, this.SelectedNamHoc);
                frm.ShowDialog();
            }
        }

        private void btnDotThi_ExportToExcel_Click(object sender, EventArgs e)
        {
            gridDeThi.ToExcel(true);
        }

        private void btnDeThi_ExportToRtfFile_Click(object sender, EventArgs e)
        {
            if (bsDeThi.Count == 0)
                return;

            var lstDeThi = bsDeThi.DataSource as MySortableBindingList<DeInRa>;// (BLL.BizDeInRa.GetListDeInRaWithTenHocPhan(dotThi.MaDotThi));

            var frm = new FormQuanLyDeThi_Export(this.SelectedDotThi, lstDeThi);
            frm.StartPosition = FormStartPosition.CenterParent;
            frm.ShowDialog(this);

            //var lstMaDeInRa = new List<string>();
            //foreach (DataGridViewRow row in gridDeThi.Rows)
            //{
            //    var deInRa = row.DataBoundItem as DAL.Models.DeInRa;
            //    lstMaDeInRa.Add(deInRa.MaDeThi);
            //}

            //if (lstMaDeInRa.Count == 0)
            //{
            //    DialogUtils.ShowMessage("Vui lòng chọn ít nhất một đề thi trước khi thực hiện thao tác này!");
            //    return;
            //}

            //string folderPath = "";
            //FolderBrowserDialog dlgFolder = new FolderBrowserDialog();
            //dlgFolder.Description = "Chọn thư mục để lưu bộ đề thi.\n\nLưu ý: Chương trình sẽ GHI ĐÈ lên các tệp đã tồn tại.";
            //if (dlgFolder.ShowDialog() != DialogResult.OK)
            //    return;
            //folderPath = dlgFolder.SelectedPath;

            //var frm = new FormProgress();
            //frm.DoWork += (oSender, oE) =>
            //    {
            //        var nOK = 0;
            //        var sbError = new StringBuilder();
            //        var worker = frm.Worker;
            //        var hocKy = this.SelectedHocKy;
            //        var namHoc = this.SelectedNamHoc;
            //        using (var context = DAL.Models.QLNHD_KHContext.GetContext())
            //        {
            //            for (int i = 0; i <= lstMaDeInRa.Count - 1; i++)
            //            {
            //                try
            //                {
            //                    var state = string.Format("{0}/{1}", i + 1, lstMaDeInRa.Count);
            //                    worker.ReportProgress(10, state);

            //                    var maDeThi = lstMaDeInRa[i];
            //                    var deInRa = context.DeInRaDbSet.Where(x => x.MaDeThi == maDeThi).FirstOrDefault();
            //                    if (deInRa == null)
            //                        throw new Exception("Không tìm thấy đề thi");

            //                    var stRtfCode = FormDeThi_ChiTiet.GetGeneratedRtfCodeForDeThi(deInRa, hocKy, namHoc, context);
            //                    var filePath = System.IO.Path.Combine(folderPath, deInRa.TenDeThi + ".rtf");
            //                    System.IO.File.WriteAllText(filePath, stRtfCode);
            //                    nOK++;
            //                }
            //                catch (Exception exc)
            //                {
            //                    sbError.AppendFormat("{0}: {1}", i, exc.Message);
            //                }
            //            }
            //        }
            //        oE.Result = nOK;
            //    };
            //frm.ProgressChanged += (oSender, oE) =>
            //    {
            //        frm.setSubMessage(oE.UserState.ToString());
            //    };
            //frm.RunWorkerCompleted += (oSender, oE) =>
            //    {
            //        var nOK = Convert.ToInt32(oE.Result);
            //        DialogUtils.ShowMessage("Đã lưu {0}/{1} bộ đề thi xuống đĩa.", nOK, lstMaDeInRa.Count);
            //    };
            //frm.StartWorking(this);
        }

        private void gridDeThi_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.RowIndex >= 0 && e.RowIndex <= bsDeThi.Count - 1)
                {
                    bsDeThi.Position = e.RowIndex;
                    btnDeThi_Details.PerformClick();
                }
            }
            catch { }
        }

        private void btnDeleteAll_Click(object sender, EventArgs e)
        {
            var ans = DialogUtils.ShowYesNo(string.Format("Bạn có chắc chắn muốn XOÁ TẤT CẢ ĐỀ THI ({0} đề thi) đã sinh ra trong đợt thi này không?", bsDeThi.Count));
            if (ans != System.Windows.Forms.DialogResult.Yes)
                return;

            try
            {
                var n = bsDeThi.Count;
                var lst = bsDeThi.DataSource as MySortableBindingList<DeInRa>;
                for (int i = 0; i < n; i++)
                {
                    var dethi = lst[i];
                    if (dethi != null)
                        BLL.BizDeInRa.XoaDeInRa(dethi);
                    else
                        break;
                }
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError("Lỗi trong quá trình xoá tất cả đề thi.\nChi tiết lỗi: " + exc);
            }
            UpdateGuiBySelectedDotThi();
        }

        //// global counters
        //private int documentIndex = 0;
        //private int pageIndex = 0;
        //private TXTextControl.TextControl textControl1;


        //// loads the next document into TextControl
        //private void LoadDocument(string path)
        //{
        //    textControl1.Load(path, TXTextControl.StreamType.RichTextFormat);
        //    pageIndex = textControl1.Pages;
        //    documentIndex++;
        //}

        //void pd_QueryPageSettings(object sender, QueryPageSettingsEventArgs e)
        //{
        //    // calls LoadDocument, if all pages of the current document have been printed
        //    if (pageIndex == 0)
        //    {
        //        if (documentIndex != lb_documents.Items.Count)
        //            LoadDocument();
        //    }

        //    // landscape or portait?
        //    textControl1.Selection.Start = textControl1.GetPages()[textControl1.Pages - pageIndex + 1].Start;
        //    TXTextControl.SectionFormat sf = textControl1.Sections.GetItem().Format;
        //    e.PageSettings.Landscape = sf.Landscape;
        //}

        //void pd_PrintPage(object sender, PrintPageEventArgs e)
        //{
        //    //textControl1.Print(textControl1.Pages - pageIndex + 1, e); pageIndex--; if (pageIndex != 0 || documentIndex != lb_documents.Items.Count) e.HasMorePages = true; else e.HasMorePages = false; 
        //}

        //private void btnDethi_In_Click(object sender, EventArgs e)
        //{
        //    var lstMaDeInRa = new List<string>();
        //    foreach (DataGridViewRow row in gridDeThi.SelectedRows)
        //    {
        //        var deInRa = row.DataBoundItem as DAL.Models.DeInRa;
        //        lstMaDeInRa.Add(deInRa.MaDeThi);
        //    }

        //    if (lstMaDeInRa.Count == 0)
        //    {
        //        DialogUtils.ShowMessage("Vui lòng chọn ít nhất một đề thi trước khi thực hiện thao tác này!");
        //        return;
        //    }

        //    // reset counters
        //    documentIndex = 0;
        //    pageIndex = 0;

        //    // This PrintDocument handles the complete printing 
        //    PrintDocument pd = new PrintDocument();

        //    pd.QueryPageSettings += new QueryPageSettingsEventHandler(pd_QueryPageSettings);
        //    pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);

        //    // start the printing
        //    pd.Print();

        //    var frm = new FormProgress();
        //    frm.DoWork += (oSender, oE) =>
        //    {
        //        var nOK = 0;
        //        var sbError = new StringBuilder();
        //        var worker = frm.Worker;
        //        var hocKy = this.SelectedHocKy;
        //        var namHoc = this.SelectedNamHoc;
        //        using (var context = DAL.Models.QLNHD_KHContext.GetContext())
        //        {
        //            for (int i = 0; i <= lstMaDeInRa.Count - 1; i++)
        //            {
        //                try
        //                {
        //                    var state = string.Format("{0}/{1}", i + 1, lstMaDeInRa.Count);
        //                    worker.ReportProgress(10, state);

        //                    var maDeThi = lstMaDeInRa[i];
        //                    var deInRa = context.DeInRaDbSet.Where(x => x.MaDeThi == maDeThi).FirstOrDefault();
        //                    if (deInRa == null)
        //                        throw new Exception("Không tìm thấy đề thi");

        //                    var stRtfCode = FormDeThi_ChiTiet.GetGeneratedRtfCodeForDeThi(deInRa, hocKy, namHoc, context);
        //                    PrintDocument pd = new PrintDocument();
        //                    pd.QueryPageSettings += new QueryPageSettingsEventHandler(pd_QueryPageSettings);
        //                    pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
        //                    pd.Print();
        //                    nOK++;
        //                }
        //                catch (Exception exc)
        //                {
        //                    sbError.AppendFormat("{0}: {1}", i, exc.Message);
        //                }
        //            }
        //        }
        //        oE.Result = nOK;
        //    };
        //    frm.ProgressChanged += (oSender, oE) =>
        //    {
        //        frm.setSubMessage(oE.UserState.ToString());
        //    };
        //    frm.RunWorkerCompleted += (oSender, oE) =>
        //    {
        //        var nOK = Convert.ToInt32(oE.Result);
        //        DialogUtils.ShowMessage("Đã lưu {0}/{1} bộ đề thi xuống đĩa.", nOK, lstMaDeInRa.Count);
        //    };
        //    frm.StartWorking(this);
        //}
    }
}
